//
//  GYPeriphreal.h
//  LockManagement
//
//  Created by apple on 2018/7/30.
//  Copyright © 2018年 yunjiazhineng. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>

@class GYCenterManager;
@class GYPeriphreal;
@class GYService;

typedef NS_ENUM(NSUInteger, deviceConntType){
    deviceConntTypeSuccess = 0, //设备了解成功
    deviceConntTypeFailed, //设备连接失败
    deviceConntTypeFiledTimeOut, //设备连接失败,(连接超时)
    deviceConntTypeDisConnect, //设别断开连接
};

/**
 设备连接回调

 @param periphreal 连接的设备
 @param error 连接错误
 @param deviceConnectType 连接状态
 */
typedef void(^blueManagerConnectDeviceBlock)(GYPeriphreal *periphreal, NSError *error, deviceConntType deviceConnectType);

/**
 读取RSSI之后的回调

 @param periphreal 外围设备
 @param RSSI 外围设备的RSSI值
 @param error 错误描述
 */
typedef void(^blueManagerReadRSSIBlock)(GYPeriphreal *periphreal, NSNumber *RSSI, NSError *error);

/**
 搜索到服务时候的回调

 @param periphreal 外围设备
 @param serviceArray 该设备下的所有服务
 @param error 错误
 */
typedef void(^blueManagerSearchDeviceServiceBlock)(GYPeriphreal *periphreal, NSArray<GYService *> *serviceArray, NSError *error);



@interface GYPeriphreal : NSObject

/** 设备名称 */
@property (nonatomic, strong,readonly) NSString *name;

/** 设别唯一ID */
@property (nonatomic, strong,readonly) NSUUID *identifier;

/** 设备ID字符串 */
@property (nonatomic, strong,readonly) NSString *identifierString;

/** 当前外围设备 */
@property (nonatomic, strong) CBPeripheral *periphreal;

/** 当前设备的管理者 */
@property (nonatomic, strong,readonly) GYCenterManager *centerManager;

/** 设备被扫描到的次数 */
@property (nonatomic, assign) NSUInteger deviceScanCount;

/** 设备的RSSI值 */
@property (nonatomic, strong) NSNumber *RSSI;

/** 当前外围设备广播的数据 */
@property (nonatomic, strong) NSDictionary *advertisementData;

/** 当前外围设备是否连接成功 */
@property (nonatomic, assign ,readonly) BOOL isConnected;

/** 当前外围设备的状态 */
@property (nonatomic, assign) CBPeripheralState state;

/** 当前设备中的错误信息 */
@property (nonatomic, strong) NSError *connectErrorDescription;

/** 当前设备的所有服务 */
@property (nonatomic, strong) NSMutableArray<GYService *> *serviceArray;

/** 连接设备回调 */
@property (nonatomic, copy) blueManagerConnectDeviceBlock blueManagerConnectDeviceCallBack;


/**
 初始化一个外围设备

 @param periphreal 外围设备
 @return <#return value description#>
 */
- (instancetype)initWithPeriphreal:(CBPeripheral *)periphreal;

/**
 初始化一个外围设备

 @param periphreal 外围设备
 @param manager 中心设备
 @return <#return value description#>
 */
- (instancetype)initWithPeriphreal:(CBPeripheral *)periphreal central:(GYCenterManager *)manager;

/**
 连接设备

 @param callBack <#callBack description#>
 */
- (void)connectDeviceWithBlcok:(blueManagerConnectDeviceBlock)callBack;

/**
 连接设备

 @param timeOut 超时时间
 @param callBack <#callBack description#>
 */
- (void)connectDeviceWithTimeOut:(NSTimeInterval)timeOut callBack:(blueManagerConnectDeviceBlock)callBack;

/**
 连接设备

 @param timeOut 超时时间
 @param options 连接设备时间
 @param callBack <#callBack description#>
 */
- (void)connectDeviceWithTimeOut:(NSTimeInterval)timeOut options:(NSDictionary *)options callBack:(blueManagerConnectDeviceBlock)callBack;

/**
 如果设备失去连接, 调用此方法重新连接 (会保留上一次的调用参数)
 */
- (void)reconnectDevice;

/**
 主动断开设备 (不会回调设备失去连接方法)
 */
- (void)disConnectDevice;

/**
 重置设备被发现次数
 */
- (void)resetDeviceScanCount;

/**
 读取涉笔的RSSI值

 @param callback <#callback description#>
 */
- (void)readDeviceRSSIWithCallback:(blueManagerReadRSSIBlock)callback ;

/**
 处理manager连接设备的结果(只有两种情况------>1:连接成功  2:连接失败)

 @param error 错误信息
 @param deviceConnectType 连接状态
 */
- (void)dealDeviceConnectWithError:(NSError *)error deviceConnectType:(deviceConntType)deviceConnectType;

/**
 得到连接设备的服务

 @param service 服务
 @return <#return value description#>
 */
- (GYService *)searchServiceWithService:(CBService *)service ;

/**
 发现设备上的所有服务

 @param callBack <#callBack description#>
 */
- (void)discoverAllDeviceServiceWithCallBack:(blueManagerSearchDeviceServiceBlock)callBack;

/**
 根据服务id条件 来查找设备中的所有服务

 @param uuidArray <#uuidArray description#>
 @param callback <#callback description#>
 */
- (void)discoverDeviceServiceWithUUIDArray:(NSArray<CBUUID *> *)uuidArray
                                  callback:(blueManagerSearchDeviceServiceBlock)callback;



@end
